public class StringParserStateMachine {

    // -----------------------
    // 状态定义
    // -----------------------
    enum State {
        READ_CHAR,      // 读取字符（等待遇到引号）
        READ_STRING,    // 读取字符串内容
        ESCAPE_CHAR,    // 处理转义字符
        OUTPUT_STRING   // 输出字符串
    }

    // 当前状态
    private State currentState = State.READ_CHAR;

    private StringBuilder buffer = new StringBuilder();   // 保存构造中的字符串
    private String result = "";                           // 最终输出结果

    // 转换状态
    private void transitionTo(State newState) {
        currentState = newState;
    }

    // -----------------------
    // 主入口：处理一个字符
    // -----------------------
    public void input(char c) {

        switch (currentState) {

            case READ_CHAR:
                handleReadChar(c);
                break;

            case READ_STRING:
                handleReadString(c);
                break;

            case ESCAPE_CHAR:
                handleEscapeChar(c);
                break;

            case OUTPUT_STRING:
                System.out.println("最终输出: " + result);
                break;
        }
    }

    // -----------------------
    // 状态：读取字符
    // -----------------------
    private void handleReadChar(char c) {

        if (c == '"') {
            // 遇到引号 → 进入读取字符串
            transitionTo(State.READ_STRING);
        }
        // 其他字符忽略
    }

    // -----------------------
    // 状态：读取字符串
    // -----------------------
    private void handleReadString(char c) {

        if (c == '"') {
            // 遇到第二个引号 → 字符串结束
            result = buffer.toString();
            transitionTo(State.OUTPUT_STRING);

        } else if (c == '\\') {
            // 遇到反斜杠 → 进入转义
            transitionTo(State.ESCAPE_CHAR);

        } else {
            // 普通字符，加入缓冲区
            buffer.append(c);
        }
    }

    // -----------------------
    // 状态：转义字符
    // -----------------------
    private void handleEscapeChar(char c) {

        // 实现常见转义
        switch (c) {
            case 'n': buffer.append('\n'); break;
            case 't': buffer.append('\t'); break;
            case 'r': buffer.append('\r'); break;
            case '\\': buffer.append('\\'); break;
            case '"': buffer.append('"'); break;
            default: buffer.append(c); // 未知转义，按原样处理
        }

        // 转义完成后返回读取字符串
        transitionTo(State.READ_STRING);
    }

    // -----------------------
    // 获得最终解析结果
    // -----------------------
    public String getResult() {
        return result;
    }
}
